

<!DOCTYPE html>
<html lang="zh" data-default-color-scheme=&#34;auto&#34;>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/walker_sue/img/favicon.png">
  <link rel="icon" type="image/png" href="/walker_sue/img/favicon.png">
  <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="description" content="">
  <meta name="author" content="lk">
  <meta name="keywords" content="">
  <title>强化学习与推荐系统 - Walker_Sue</title>

  <link  rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/css/bootstrap.min.css" />


  <link  rel="stylesheet" href="https://cdn.staticfile.org/github-markdown-css/4.0.0/github-markdown.min.css" />
  <link  rel="stylesheet" href="/walker_sue/lib/hint/hint.min.css" />

  
    
    
      
      <link  rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.0/styles/github-gist.min.css" />
    
  

  


<!-- 主题依赖的图标库，不要自行修改 -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_ba1fz6golrf.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_kmeydafke9r.css">


<link  rel="stylesheet" href="/walker_sue/css/main.css" />

<!-- 自定义样式保持在最底部 -->


  <script  src="/walker_sue/js/utils.js" ></script>
  <script  src="/walker_sue/js/color-schema.js" ></script>
<meta name="generator" content="Hexo 5.3.0"></head>


<body>
  <header style="height: 70vh;">
    <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand"
       href="/walker_sue/">&nbsp;<strong>Walker</strong>&nbsp;</a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/">
                <i class="iconfont icon-home-fill"></i>
                主页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/walker_sue/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item dropdown">
              <a class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <i class="iconfont icon-books"></i>
                文档
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/">
                    
                    主题博客
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/docs/guide/">
                    
                    配置指南
                  </a>
                
                  
                  
                  
                  <a class="dropdown-item" target="_blank" rel="noopener" href="https://hexo.fluid-dev.com/docs/icon/">
                    
                    图标用法
                  </a>
                
              </div>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" data-toggle="modal" data-target="#modalSearch">&nbsp;<i
                class="iconfont icon-search"></i>&nbsp;</a>
          </li>
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" href="javascript:">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

    <div class="banner intro-2" id="background" parallax=true
         style="background: url('/walker_sue/img/default.png') no-repeat center center;
           background-size: cover;">
      <div class="full-bg-img">
        <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
          <div class="container page-header text-center fade-in-up">
    <span class="h2" id="subtitle">
    
</span>




<div class="mt-3">
  
  
    <span class="post-meta">
      <i class="iconfont icon-date-fill" aria-hidden="true"></i>
      <time datetime="2021-03-08 10:25" pubdate>
        March 8, 2021 am
      </time>
    </span>
  
</div>

<div class="mt-1">
  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-chart"></i>
      6.7k 字
    </span>
  

  
    
    <span class="post-meta mr-2">
      <i class="iconfont icon-clock-fill"></i>
      
      
      74
       分钟
    </span>
  

  
  
</div>


</div>

          
        </div>
      </div>
    </div>
  </header>

  <main>
    
      

<div class="container-fluid">
  <div class="row">
    <div class="d-none d-lg-block col-lg-2"></div>
    <div class="col-lg-8 nopadding-md">
      <div class="container nopadding-md" id="board-ctn">
        <div class="py-5" id="board">
          <article class="post-content mx-auto" id="post">
            <!-- SEO header -->
            <h1 style="display: none">强化学习与推荐系统</h1>
            
            <div class="markdown-body" id="post-body">
              <div align='center' ><font size='10'>机器学习-BI</font></div>

<hr>
<div align='center' ><font size='5'>Week_06</font></div>
<div align='center' ><font size='5'>强化学习与推荐系统</font></div>

<hr>
<h2 id="Reinforcement-Learning"><a href="#Reinforcement-Learning" class="headerlink" title="Reinforcement Learning"></a>Reinforcement Learning</h2><h3 id="1-强化学习概述"><a href="#1-强化学习概述" class="headerlink" title="1.强化学习概述"></a>1.强化学习概述</h3><p>Reinforcement Learning <br><br><img src="pip01.png" srcset="/walker_sue/img/loading.gif"><br><br><br>基本概念：<br></p>
<ul>
<li>个体，Agent，学习器的角色，也称为智能体</li>
<li>环境，Environment，Agent之外一切组成的、与之交互的事物</li>
<li>动作，Action，Agent的行为</li>
<li>状态，State，Agent从环境获取的信息</li>
<li>奖励，Reward，环境对于动作的反馈</li>
<li>策略，Policy，Agent根据状态进行下一步动作的函数</li>
<li>状态转移概率，Agent做出动作后进入下一状态的概率</li>
<li>四个重要的要素：状态(state)、动作(action)、策略（policy）、奖励(reward)<br></li>
<li>强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。</li>
<li>示意图由两部分组成：agent 和 environment。</li>
<li>在强化学习过程中，agent 跟 environment 一直在交互。Agent 在环境里面获取到状态，agent 会利用这个状态输出一个动作(action)，一个决策。然后这个决策会放到环境之中去，环境会根据 agent 采取的决策，输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多地从环境中获取奖励。<br><br><img src="pip02.png" srcset="/walker_sue/img/loading.gif"><br>
我们可以把强化学习跟监督学习做一个对比。<br></li>
<li>举个图片分类的例子，监督学习(supervised learning)就是说我们有一大堆标注的数据，比如车、飞机、凳子这些标注的图片，这些图片都要满足独立同分布(i.i.d.)，就是它们之间是没有关联的。</li>
<li>然后我们训练一个分类器，比如说右边这个神经网络。为了分辨出这个图片是车辆还是飞机，训练过程中，我们把真实的标签给了这个网络。当这个网络做出一个错误的预测，比如现在输入了汽车的图片，它预测出来是飞机。我们就会直接告诉它，你这个预测是错误的，正确的标签应该是车。然后我们把这个错误写成一个损失函数(loss function)，通过反向传播(Backpropagation)来训练这个网络。</li>
<li>所以在监督学习过程中，有两个假设：<ul>
<li>输入的数据（标注的数据）都是没有关联的，尽可能没有关联。因为如果有关联的话，这个网络是不好学习的。</li>
<li>我们告诉学习器(learner)正确的标签是什么，这样它可以通过正确的标签来修正自己的预测。<br>

</li>
</ul>
</li>
</ul>
<p>强化学习的特点：<br></p>
<ul>
<li>没有监督数据、只有奖励信号</li>
<li>奖励信号不一定是实时的，很可能是延后的，甚至延后很多</li>
<li>时间（序列）是一个重要因素</li>
<li>当前的行为影响后续接收到的数据 <br></li>
</ul>
<h3 id="2-强化学习的主体结构（Major-Components-of-an-RL-Agent）"><a href="#2-强化学习的主体结构（Major-Components-of-an-RL-Agent）" class="headerlink" title="2 强化学习的主体结构（Major Components of an RL Agent）"></a>2 强化学习的主体结构（Major Components of an RL Agent）</h3><p>对于一个强化学习 agent，它可能有一个或多个如下的组成成分：<br></p>
<ul>
<li>首先 agent 有一个 策略函数(policy function)，agent 会用这个函数来选取下一步的动作。</li>
<li>然后它也可能生成一个价值函数(value function)。我们用价值函数来对当前状态进行估价，它就是说你进入现在这个状态，可以对你后面的收益带来多大的影响。当这个价值函数大的时候，说明你进入这个状态越有利。</li>
<li>另外一个组成成分是模型(model)。模型表示了 agent 对这个环境的状态进行了理解，它决定了这个世界是如何进行的。<br><br>

</li>
</ul>
<p><strong>2.1 Policy</strong><br><br>Policy 是 agent 的行为模型，它决定了这个 agent 的行为，它其实是一个函数，把输入的状态变成行为。这里有两种 policy：<br><br>一种是 stochastic policy(随机性策略)，它就是 $\pi$ 函数 $\pi(a | s)=P\left[A_{t}=a | S_{t}=s\right]π(a∣s)$ 。当你输入一个状态 ss 的时候，输出是一个概率。这个概率就是你所有行为的一个概率，然后你可以进一步对这个概率分布进行采样，得到真实的你采取的行为。比如说这个概率可能是有 70% 的概率往左，30% 的概率往右，那么你通过采样就可以得到一个 action。<br>一种是 deterministic policy(确定性策略)，就是说你这里有可能只是采取它的极大化，采取最有可能的动作，即$a^{*}=\arg \underset{a}{\max} \pi(a \mid s)$。 你现在这个概率就是事先决定好的。<br></p>
<p><strong>2.2 Value Function</strong><br><br><strong>价值函数是未来奖励的一个预测，用来评估状态的好坏。</strong><br><br>价值函数里面有一个 discount factor(折扣因子)，我们希望尽可能在短的时间里面得到尽可能多的奖励。如果我们说十天过后，我给你 100 块钱，跟我现在给你 100 块钱，你肯定更希望我现在就给你 100 块钱，因为你可以把这 100 块钱存在银行里面，你就会有一些利息。所以我们就通过把这个折扣因子放到价值函数的定义里面，价值函数的定义其实是一个期望，如下式所示：<br></p>
<p>$$v_{\pi}(s) \doteq {E}<em>{\pi}\left[G</em>{t} \mid S_{t}=s\right]={E}<em>{\pi}\left[\sum</em>{k=0}^{\infty} \gamma^{k} R_{t+k+1} \mid S_{t}=s\right], \text { for all } s \in \mathcal{S}, for all s∈S $$</p>
<p>这里有一个期望 ${E}_{\pi}$，这里有个小角标是 $\pi$ 函数，这个 $\pi$ 函数就是说在我们已知某一个策略函数的时候，到底可以得到多少的奖励。<br><br>我们还有一种价值函数：Q 函数。Q 函数里面包含两个变量：状态和动作，其定义如下式所示：<br></p>
<p>$$q_{\pi}(s, a) \doteq {E}<em>{\pi}\left[G</em>{t} \mid S_{t}=s, A_{t}=a\right]={E}<em>{\pi}\left[\sum</em>{k=0}^{\infty} \gamma^{k} R_{t+k+1} \mid S_{t}=s, A_{t}=a\right]$$</p>
<p>所以你未来可以获得多少的奖励，它的这个期望取决于你当前的状态和当前的行为。这个 Q 函数是强化学习算法里面要学习的一个函数。因为当我们得到这个 Q 函数后，进入某一种状态，它最优的行为就可以通过这个 Q 函数来得到。<br></p>
<p><strong>2.3 Model</strong><br><br><img src="model.png" srcset="/walker_sue/img/loading.gif"><br><br><br>第三个组成部分是模型，模型决定了下一个状态会是什么样的，就是说下一步的状态取决于你当前的状态以及你当前采取的行为。它由两个部分组成:</p>
<ul>
<li>概率：这个转移状态之间是怎么转移的。</li>
<li>奖励函数：当你在当前状态采取了某一个行为，可以得到多大的奖励。<br>

</li>
</ul>
<p><strong>2.4 Types of RL Agents</strong><br>根据 agent 学习的东西不同，我们可以把 agent 进行归类。<br></p>
<ul>
<li><strong>基于价值的 agent(value-based agent)。</strong><ul>
<li>这一类 agent 显式地学习的是价值函数，</li>
<li>隐式地学习了它的策略。策略是从我们学到的价值函数里面推算出来的。</li>
</ul>
</li>
<li><strong>基于策略的 agent(policy-based agent)。</strong><ul>
<li>这一类 agent 直接去学习 policy，就是说你直接给它一个状态，它就会输出这个动作的概率。</li>
<li>在基于策略的 agent 里面并没有去学习它的价值函数。</li>
</ul>
</li>
<li>把 value-based 和 policy-based 结合起来就有了 Actor-Critic agent。这一类 agent 把它的策略函数和价值函数都学习了，然后通过两者的交互得到一个最佳的行为。</li>
</ul>
<p><brt>Policy-Based优势：</p>
<ul>
<li>收敛性好，因为Policy-Based每次只改善一点点，但总是朝着好的方向在改善，而有些价值函数在后期会一直围绕最优价值函数持续小的震荡而不收敛</li>
<li>对于高维度或连续状态空间来说，更高效，使用基于价值函数的学习在得到价值函数后，制定策略时，需要比较各种行为对应的价值大小，这个比较过程就比较难，而采用Policy-Based会高效很多</li>
<li>能学到一些随机策略，而Value-Based通常是学不到随机策略</li>
<li>针对价值函数非常复杂的情况，采用Policy-Based更适合。比如当小球从从空中某个位置落下你需要左右移动接住时，计算小球在某一个位置时采取什么行为的价值是很难计算的，但基于策略就简单许多，只需要朝着小球落地的方向移动即可</li>
</ul>
<p><br>Q: 基于策略迭代和基于价值迭代的强化学习方法有什么区别?<br><br>A: 对于一个状态转移概率已知的马尔可夫决策过程，我们可以使用动态规划算法来求解；从决策方式来看，强化学习又可以划分为基于策略迭代的方法和基于价值迭代的方法。决策方式是智能体在给定状态下从动作集合中选择一个动作的依据，它是静态的，不随状态变化而变化。<br><br>在基于策略迭代的强化学习方法中，智能体会制定一套动作策略（确定在给定状态下需要采取何种动作），并根据这个策略进行操作。强化学习算法直接对策略进行优化，使制定的策略能够获得最大的奖励。<br><br>而在基于价值迭代的强化学习方法中，智能体不需要制定显式的策略，它维护一个价值表格或价值函数，并通过这个价值表格或价值函数来选取价值最大的动作。基于价值迭代的方法只能应用在不连续的、离散的环境下（如围棋或某些游戏领域），对于行为集合规模庞大、动作连续的场景（如机器人控制领域），其很难学习到较好的结果（此时基于策略迭代的方法能够根据设定的策略来选择连续的动作)。<br><br>基于价值迭代的强化学习算法有 Q-learning、 Sarsa 等，而基于策略迭代的强化学习算法有策略梯度算法等。此外， Actor-Critic 算法同时使用策略和价值评估来做出决策，其中，智能体会根据策略做出动作，而价值函数会对做出的动作给出价值，这样可以在原有的策略梯度算法的基础上加速学习过程，取得更好的效果。</p>
<p><br><strong>另外，我们是可以通过 agent 到底有没有学习这个环境模型来分类。</strong></p>
<ul>
<li>第一种是<strong>model-based(有模型) RL agent</strong>，它通过学习这个状态的转移来采取动作。</li>
<li>另外一种是<strong>model-free(免模型) RL agent</strong>，它没有去直接估计这个状态的转移，也没有得到环境的具体转移变量。它通过学习价值函数和策略函数进行决策。Model-free 的模型里面没有一个环境转移的模型。</li>
</ul>
<p><br>我们可以用马尔可夫决策过程来定义强化学习任务，并表示为四元组 &lt;S,A,P,R&gt;&lt;S,A,P,R&gt;，即状态集合、动作集合、状态转移函数和奖励函数。如果这四元组中所有元素均已知，且状态集合和动作集合在有限步数内是有限集，则机器可以对真实环境进行建模，构建一个虚拟世界来模拟真实环境的状态和交互反应。<br><br>具体来说，当智能体知道状态转移函数 $P(s_{t+1}|s_t,a_t)$ 和奖励函数 $R(s_t,a_t)$后，它就能知道在某一状态下执行某一动作后能带来的奖励和环境的下一状态，这样智能体就不需要在真实环境中采取动作，直接在虚拟世界中学习和规划策略即可。这种学习方法称为有模型学习。<br><img src="pip03.png" srcset="/walker_sue/img/loading.gif"><br><br></p>
<h3 id="3-强化学习算法相关"><a href="#3-强化学习算法相关" class="headerlink" title="3.强化学习算法相关"></a>3.强化学习算法相关</h3><p><strong>3.1 Markov Process(MP)</strong> <br><br><img src="mp.png" srcset="/walker_sue/img/loading.gif"><br>如果一个状态转移是符合马尔可夫的，那就是说一个状态的下一个状态只取决于它当前状态，而跟它当前状态之前的状态都没有关系。<br>我们设状态的历史为 $h_{t}={s_{1},s_{2},s_{3},\ldots,s_{t}}$<br>包含了之前的所有状态），如果一个状态转移是符合马尔可夫的，也就是满足如下条件：<br><br>$$p\left(s_{t+1} \mid s_{t}\right) =p\left(s_{t+1} \mid h_{t}\right) \tag{1}$$<br>$$p\left(s_{t+1} \mid s_{t}, a_{t}\right) =p\left(s_{t+1} \mid h_{t}, a_{t}\right) \tag{2}$$<br>从当前 $s_t$转移到 $s_{t+1}$这个状态，它是直接就等于它之前所有的状态转移到 $s_{t+1}$ 。如果某一个过程满足马尔可夫性质(Markov Property)，就是说未来的转移跟过去是独立的，它只取决于现在。马尔可夫性质是所有马尔可夫过程的基础。<br></p>
<p><strong>3.2 Markov Process/Markov Chain</strong> <br><br>首先看一看马尔可夫链(Markov Chain)。举个例子，这个图里面有四个状态，这四个状态从$s_1,s_2,s_3,s_4$之间互相转移。比如说从$s_1$ 开始，</p>
<ul>
<li>$s_1$有 0.1 的概率继续存活在$s_1$ 状态，</li>
<li>有 0.2 的概率转移到$s_2$，</li>
<li>有 0.7 的概率转移到$s_4$。</li>
</ul>
<p>如果$s_4$是我们当前状态的话，</p>
<ul>
<li>它有 0.3 的概率转移到$s_2$，</li>
<li>有 0.2 的概率转移到$s_3$ ，</li>
<li>有 0.5 的概率留在这里。</li>
</ul>
<p>我们可以用**状态转移矩阵(State Transition Matrix) PP **来描述状态转移 $p\left(s_{t+1}=s^{\prime} \mid s_{t}=s\right)$，如下式所示。</p>
<p>$$P=\left[\begin{array}{cccc} P\left(s_{1} \mid s_{1}\right) &amp; P\left(s_{2} \mid s_{1}\right) &amp; \ldots &amp; P\left(s_{N} \mid s_{1}\right) \ P\left(s_{1} \mid s_{2}\right) &amp; P\left(s_{2} \mid s_{2}\right) &amp; \ldots &amp; P\left(s_{N} \mid s_{2}\right) \ \vdots &amp; \vdots &amp; \ddots &amp; \vdots \ P\left(s_{1} \mid s_{N}\right) &amp; P\left(s_{2} \mid s_{N}\right) &amp; \ldots &amp; P\left(s_{N} \mid s_{N}\right) \end{array}\right]$$<br>状态转移矩阵类似于一个 conditional probability，当我们知道当前我们在$s_t$这个状态过后，到达下面所有状态的一个概念。所以它每一行其实描述了是从一个节点到达所有其它节点的概率。<br><br>马尔可夫链模型可以表示为=（S，P，Q）:</p>
<ul>
<li>S是系统所有可能的状态所组成的状态集(也称为状态空间）</li>
<li>P是状态转移矩阵</li>
<li>Q是系统的初始概率分布，$Q = [q_1,1_2,K,q_n]$<br><img src="mp02.png" srcset="/walker_sue/img/loading.gif"><br>

</li>
</ul>
<p><strong>3.3 Markov Reward Process(MRP)</strong><br><img src="mrp.png" srcset="/walker_sue/img/loading.gif"><br><br>马尔可夫奖励过程(Markov Reward Process, MRP) 是马尔可夫链再加上了一个奖励函数。在 MRP 中，转移矩阵跟它的这个状态都是跟马尔可夫链一样的，多了一个奖励函数(reward function)。奖励函数是一个期望，就是说当你到达某一个状态的时候，可以获得多大的奖励，然后这里另外定义了一个 discount factor $\gamma$。<br><br><br><strong>Return and Value function</strong> <br><br>Horizon 是指一个回合的长度（每个回合最大的时间步数），它是由有限个步数决定的。<br><br>Return(回报) 说的是把奖励进行折扣后所获得的收益。Return 可以定义为奖励的逐步叠加，如下式所示：<br><br>$$G_{t}=R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\gamma^{3} R_{t+4}+\ldots+\gamma^{T-t-1} R_{T}$$<br>这里有一个叠加系数，越往后得到的奖励，折扣得越多。这说明我们其实更希望得到现有的奖励，未来的奖励就要把它打折扣。<br><br>当我们有了 return 过后，就可以定义一个状态的价值了，就是 state value function。对于 MRP，state value function 被定义成是 return 的期望，如下式所示：<br><br>$$\begin{aligned} V_{t}(s) &amp;={E}\left[G_{t} \mid s_{t}=s\right] \ &amp;={E}\left[R_{t+1}+\gamma R_{t+2}+\gamma^{2} R_{t+3}+\ldots+\gamma^{T-t-1} R_{T} \mid s_{t}=s\right] \end{aligned}$$<br>是之前定义的 discounted return，我们这里取了一个期望，期望就是说从这个状态开始，你有可能获得多大的价值。所以这个期望也可以看成是对未来可能获得奖励的当前价值的一个表现，就是当你进入某一个状态过后，你现在就有多大的价值。<br><br><br><strong>3.4 蒙特卡洛算法 MCTS</strong><br><br>蒙特卡洛算法：</p>
<ul>
<li>并不是一种算法的名称，而是对一类随机算法的特性的概括</li>
<li>原理：采样越多，越近似最优解</li>
<li>比如，我要从筐里找到最大的苹果，苹果num=100，采用策略：随机拿1个，每次留下最大的，再随机拿1个……拿的次数越多，挑出的苹果就越大。除非拿满num=100次，否则无法肯定挑出的一定是最大的，这种挑苹果的算法，就属于蒙特卡洛算法，即尽量找好的，但不保证是最好的</li>
<li>如果我们求解的问题，可以在有限采样内，必须给出一个解，这个解不要求一定是最优解，那么就可以采用蒙特卡洛算法</li>
</ul>
<br>
MCTS（Monte Carlo Tree Search）：
- 蒙特卡洛树搜索，结合了随机模拟的一般性和树搜索的准确性
- MCTS是一个搜索算法，它采用的各种方法都是为了有效地减少搜索空间。在MCTS的每一个回合，起始内容是一个半展开的搜索树，目标是原先的半展开+再多展开一个/一层节点的搜索树
- MCTS的作用是通过模拟来进行预测输出结果，理论上可以用于以{state,action}为定义的任何领域

<p>使用主要步骤：</p>
<ul>
<li>选择，从根节点开始，按一定策略，搜索到叶子节点</li>
<li>扩展，对叶子节点扩展一个或多个合法的子节点</li>
<li>模拟，对子节点采用随机的方式（这也是为什么称之为蒙特卡洛的原因）模拟若干次实验。模拟到最终状态时即可得到当前模拟所得的分数</li>
<li>回传，根据子节点若干次模拟的得分，更新当前子节点的模拟次数与得分值。同时将模拟次数与得分值回传到其所有祖先节点并更新祖先节点</li>
</ul>
<p><img src="mcts01.png" srcset="/walker_sue/img/loading.gif"><br>MCTS原理：</p>
<ul>
<li>每个节点代表一个局面，A/B代表被访问B次，黑棋赢了A次</li>
</ul>
<p>我们将不断重复一个过程：</p>
<ul>
<li>Step1，选择Select，从根节点往下走，每次都选一个“最有价值的子节点”，直到找到“存在未扩展的子节点”，即这个局面存在未走过的后续着法的节点，比如 3/3 节点</li>
<li>Step2，扩展Expansion，给这个节点加上一个 0/0 子节点，对应之前所说的“未扩展的子节点”</li>
<li>Step3，模拟Simluation，用快速走子策略（Rollout policy）走到底，得到一个胜负结果（Thinking：为什么不采用AlphaGo的策略价值网络走棋）</li>
<li>Step4，回传Backup，把模拟的结果加到它的所有父节点上，假设模拟的结果是 0/1，就把0/1加到所有父节点上 </li>
</ul>
<p>MCTS的流程理解：<br>对于任意的局面State（就是节点），要么被展开过（expand），要么没有展开过（就是叶子节点）<br>展开过的节点可以通过Select步骤进入下一个局面State，下一个局面State仍然是这个过程……，一直持续下去直到这盘棋分出胜负，或者遇到某个局面没有被展开过为止<br>如果没有展开过，那么执行expand操作，通过神经网络得到每个动作的概率和胜率v，把这些动作添加到树上，最后把胜率v回传（backed up）<br>Expand的同时就在做evaluate，这是为Backup做准备，因为在Backup步骤，我们要用v来更新Q值的，但是如果只做了一次Select，棋局还没有结束，此时无法得到v，必须要等到一盘棋下完才可以得到v（当前这步的好坏评估是由最终结果决定）<br><img src="mcts02.png" srcset="/walker_sue/img/loading.gif"><br><br></p>
<p><strong>3.5 UCBS算法</strong><br><br><img src="ucbs.png" srcset="/walker_sue/img/loading.gif"><br><strong>3.6 近端策略优化算法</strong><br><br><strong>PPO-Penalty</strong> <br><br><img src="ppo-penalty.png" srcset="/walker_sue/img/loading.gif"><br><strong>PPO-Clip</strong> <br><br><img src="ppo-clip.png" srcset="/walker_sue/img/loading.gif"><br><strong>3.7 Deep Q-network(DQN)算法</strong><br><br><img src="dqn.png" srcset="/walker_sue/img/loading.gif"><br><br></p>
<h3 id="4-强化学习思考"><a href="#4-强化学习思考" class="headerlink" title="4.强化学习思考"></a>4.强化学习思考</h3><p><br>Thinking1：机器学习中的监督学习、非监督学习、强化学习有何区别<br><br>1.监督学习事先提供了带有标签的数据信息，目的就是通过模型训练能够将预测数据进行正确的归类/标签；非监督学习没有标签，主要是将类似数据通过聚类的形式来对数据进行分组；强化学习也没有标签，但是一定的episode后根据最终结果进行一个reward反馈，通过重复多次实验来找到最优策略。强化学习和有监督学习、无监督学习不同，它的学习目标是变化的、不明确的，甚至可能不存在绝对正确的标签。<br><br>2.与监督学习的区别，没有监督学习已经准备好的训练数据输出值，强化学习只有奖励值，但是这个奖励值和监督学习的输出值不一样，它不是事先给出的，而是延后给出的；与非监督学习的区别，在非监督学习中既没有输出值也没有奖励值的，只有数据特征，而强化学习有奖励值（为负是为惩罚），此外非监督学习与监督学习一样，数据之间也都是独立的，没有强化学习这样的前后依赖关系。</p>
<p><br>Thinking2：什么是策略网络，价值网络，有何区别<br><br>1.策略网络的实质是建立一个神经网络模型，通过观察环境状态预测出目前应该执行的策略，执行这个策略，并获取可以获得最大的奖励是多少。和普通的监督学习不同，策略网络不是通过feature预测label，而是根据对观察的环境状态进入模型，得到action，执行这个action后得到reward，通过reward的加权衰减并叠加后计算梯度，通过梯度优化网络参数<br><br>2.价值网络通过计算目前状态s的累积分数的期望，数值网络给游戏中的状态赋予一个数值/分数。每个状态都经历了整个数值网络。奖赏更多的状态显然在数值网络中的值更大。</p>
<p><br>Thinking3：请简述MCTS（蒙特卡洛树搜索）的原理，4个步骤Select, Expansion，Simluation，Backpropagation是如何操作的<br><br>1.选择，从根节点开始，按一定策略，搜索到叶子节点。从根节点往下走，每次都选一个“最有价值的子节点”，直到找到“存在未扩展的子节点”，即这个局面存在未走过的后续着法的节点!<br><br>2.扩展，对叶子节点扩展一个或多个合法的子节点<br><br>3.模拟，对子节点采用随机的方式（这也是为什么称之为蒙特卡洛的原因）模拟若干次实验。模拟到最终状态时即可得到当前<br><br>4.回传，根据子节点若干次模拟的得分，更新当前子节点的模拟次数与得分值。同时将模拟次数与得分值回传到其所有祖先节点并更新祖先节点</p>
<p><br>Thinking4：假设你是抖音的技术负责人，强化学习在信息流推荐中会有怎样的作用，如果要进行使用强化学习，都有哪些要素需要考虑<br><br>@强化学习再信息流推荐中的作用：强化学习可以进行智能调价技术，对于每一位访问用户，根据他们当前状态和实时动态来决定是否投放广告和投放广告进行引导，实现抖音用户个性化实时广告智能投放<br><br>@考虑因素：1.如何进行只能广告投放，是否插入广告，插入什么广告，在什么位置插入广告 2.用户数量和行为数量级别对强化模型的影响，使用决策组合是否会比较困难 3.用户信息噪音，用户的偏好和行为可能有一些随机性</p>
<p><br>Thinking5：在自动驾驶中，如何使用强化学习进行训练，请说明简要的思路<br><br>1.通过摄像头、红外线感应等将环境渲染的虚拟图像进行分割<br><br>2.然后通过提出的图像翻译网络（VISRI）将其翻译为合成的真实图像。<br><br>3.自动驾驶代理（Agent）观察合成的真实图像并执行动作(方向盘、油门、刹车等控制信号的驾驶策略Action)。<br><br>4.环境会给Agent奖励。由于Agent使用可见的近似于真实世界的图像来训练，所以它可以很好地适应现实世界的驾驶。<br><br>5.前期需要进行仿真模拟训练，不然会出现无数次的事故哈哈哈</p>
<p><br>Action（五子棋）：棋盘大小 10 * 10，采用强化学习（策略价值网络），用AI训练五子棋AI，请说明都有哪些模块，不同模块的原理<br><br>思路：<br><br>1.game模块（实现五子棋的游戏操作）,可以采用10x10矩阵的形式展示，模块包括棋谱的初始化、棋手执棋选择、棋子的移动、赢棋的规则、当前输赢状态的判定（是否结束）<br><br>2.AI交战模块，可以采用MCTS算法，创建两位独立的MCTS_player，根据模型训练模块的评估采反馈不断改进Action，Action和棋局状态调用game模块来实现<br><br>3.train模型，通过AI交战收集棋局信息，采用策略网络来两位MCTS_player分别进行评估，保存权重参数并且更新Action策略，设置一定的batch_size保存最好的模型参数用于人机交战验证<br><br>4.人机交战模块，load训练好的模型最后AI_player的Action策略，调用game模块实现游戏和状态返回，可以用来检验强化学习训练的效果<br><br></p>
<p><strong>学习资料：</strong><br><a target="_blank" rel="noopener" href="https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1?id=types-of-rl-agents">https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1?id=types-of-rl-agents</a></p>

            </div>
            <hr>
            <div>
              <div class="post-metas mb-3">
                
                  <div class="post-meta mr-3">
                    <i class="iconfont icon-category"></i>
                    
                      <a class="hover-with-bg" href="/walker_sue/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/">机器学习</a>
                    
                      <a class="hover-with-bg" href="/walker_sue/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/">强化学习</a>
                    
                  </div>
                
                
                  <div class="post-meta">
                    <i class="iconfont icon-tags"></i>
                    
                      <a class="hover-with-bg" href="/walker_sue/tags/BI/">BI</a>
                    
                      <a class="hover-with-bg" href="/walker_sue/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/">机器学习</a>
                    
                      <a class="hover-with-bg" href="/walker_sue/tags/%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95/">推荐算法</a>
                    
                  </div>
                
              </div>
              
                <p class="note note-warning">本博客所有文章除特别声明外，均采用 <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/deed.zh" rel="nofollow noopener noopener">CC BY-SA 4.0 协议</a> ，转载请注明出处！</p>
              
              
                <div class="post-prevnext row">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/walker_sue/2021/03/11/week7-alphago/">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">AlphaGo Zero实战</span>
                        <span class="visible-mobile">Vorheriger</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/walker_sue/2021/02/26/week5-DIEN/">
                        <span class="hidden-mobile">淘宝定向广告演化和天池天猫复购预测</span>
                        <span class="visible-mobile">Nächster</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>
    
      <div class="d-none d-lg-block col-lg-2 toc-container" id="toc-ctn">
        <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;TOC</p>
  <div id="tocbot"></div>
</div>

      </div>
    
  </div>
</div>

<!-- Custom -->


    
  </main>

  
    <a id="scroll-top-button" href="#" role="button">
      <i class="iconfont icon-arrowup" aria-hidden="true"></i>
    </a>
  

  
    <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">Suchen</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v"
                 for="local-search-input">Stichwort</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>
  

  

  <footer class="text-center mt-5 py-3">
  <div class="footer-content">
     <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
  </div>
  

  

  
</footer>

<!-- SCRIPTS -->
<script  src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js" ></script>
<script  src="https://cdn.staticfile.org/twitter-bootstrap/4.4.1/js/bootstrap.min.js" ></script>
<script  src="/walker_sue/js/debouncer.js" ></script>
<script  src="/walker_sue/js/main.js" ></script>

<!-- Plugins -->


  
    <script  src="/walker_sue/js/lazyload.js" ></script>
  



  



  <script defer src="https://cdn.staticfile.org/clipboard.js/2.0.6/clipboard.min.js" ></script>
  <script  src="/walker_sue/js/clipboard-use.js" ></script>







  <script  src="https://cdn.staticfile.org/tocbot/4.11.1/tocbot.min.js" ></script>
  <script>
    $(document).ready(function () {
      var boardCtn = $('#board-ctn');
      var boardTop = boardCtn.offset().top;

      tocbot.init({
        tocSelector: '#tocbot',
        contentSelector: '#post-body',
        headingSelector: 'h1,h2,h3,h4,h5,h6',
        linkClass: 'tocbot-link',
        activeLinkClass: 'tocbot-active-link',
        listClass: 'tocbot-list',
        isCollapsedClass: 'tocbot-is-collapsed',
        collapsibleClass: 'tocbot-is-collapsible',
        collapseDepth: 0,
        scrollSmooth: true,
        headingsOffset: -boardTop
      });
      if ($('.toc-list-item').length > 0) {
        $('#toc').css('visibility', 'visible');
      }
    });
  </script>



  <script  src="https://cdn.staticfile.org/typed.js/2.0.11/typed.min.js" ></script>
  <script>
    function typing(id, title){
        var typed = new Typed('#' + id, {
            strings: [
              '  ',
              title + "&nbsp;",
            ],
            cursorChar: "_",
            typeSpeed: 70,
            loop: false,
        });
        typed.stop();
        $(document).ready(function () {
            $(".typed-cursor").addClass("h2");
            typed.start();
        });
    }
    
        typing("subtitle", "强化学习与推荐系统")
    
  </script>


  <script  src="https://cdn.staticfile.org/anchor-js/4.2.2/anchor.min.js" ></script>
  <script>
    anchors.options = {
      placement: "right",
      visible: "hover",
      
    };
    var el = "h1,h2,h3,h4,h5,h6".split(",");
    var res = [];
    for (item of el) {
      res.push(".markdown-body > " + item)
    }
    anchors.add(res.join(", "))
  </script>



  <script  src="/walker_sue/js/local-search.js" ></script>
  <script>
    var path = "/walker_sue/local-search.xml";
    var inputArea = document.querySelector("#local-search-input");
    inputArea.onclick = function () {
      searchFunc(path, 'local-search-input', 'local-search-result');
      this.onclick = null
    }
  </script>



  <script  src="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.js" ></script>
  <link  rel="stylesheet" href="https://cdn.staticfile.org/fancybox/3.5.7/jquery.fancybox.min.css" />

  <script>
    $('#post img:not(.no-zoom img, img[no-zoom]), img[zoom]').each(
      function () {
        var element = document.createElement('a');
        $(element).attr('data-fancybox', 'images');
        $(element).attr('href', $(this).attr('src'));
        $(this).wrap(element);
      }
    );
  </script>





  

  
    <!-- MathJax -->
    <script>
      MathJax = {
        tex: {
          inlineMath: [['$', '$'], ['\\(', '\\)']]
        },
        options: {
          renderActions: {
            findScript: [10, doc => {
              document.querySelectorAll('script[type^="math/tex"]').forEach(node => {
                const display = !!node.type.match(/; *mode=display/);
                const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display);
                const text = document.createTextNode('');
                node.parentNode.replaceChild(text, node);
                math.start = { node: text, delim: '', n: 0 };
                math.end = { node: text, delim: '', n: 0 };
                doc.math.push(math);
              });
            }, '', false],
            insertedScript: [200, () => {
              document.querySelectorAll('mjx-container').forEach(node => {
                let target = node.parentNode;
                if (target.nodeName.toLowerCase() === 'li') {
                  target.parentNode.classList.add('has-jax');
                }
              });
            }, '', false]
          }
        }
      };
    </script>

    <script async src="https://cdn.staticfile.org/mathjax/3.0.5/es5/tex-svg.js" ></script>

  











</body>
</html>
